<?php

namespace app\service;

/**
 * 文件上传服务类
 */
class FileUploadService
{
    /**
     * 确保上传目录存在
     * @param string $uploadDir 上传目录路径
     * @return bool
     * @throws \Exception
     */
    public static function ensureUploadDirectory($uploadDir)
    {
        // 检查目录是否存在
        if (!is_dir($uploadDir)) {
            // 尝试创建目录
            if (!mkdir($uploadDir, 0755, true)) {
                throw new \Exception('创建上传目录失败: ' . $uploadDir);
            }
            
            // 创建.htaccess文件防止直接访问
            $htaccessPath = $uploadDir . '.htaccess';
            if (!file_exists($htaccessPath)) {
                $htaccessContent = "Options -Indexes\nDeny from all\n";
                file_put_contents($htaccessPath, $htaccessContent);
            }
            
            // 创建index.html防止目录浏览
            $indexPath = $uploadDir . 'index.html';
            if (!file_exists($indexPath)) {
                file_put_contents($indexPath, '<html><body><h1>403 Forbidden</h1></body></html>');
            }
        }
        
        // 检查目录是否可写
        if (!is_writable($uploadDir)) {
            throw new \Exception('上传目录不可写: ' . $uploadDir);
        }
        
        return true;
    }
    
    /**
     * 生成安全的文件名
     * @param string $originalName 原始文件名
     * @param int $userId 用户ID
     * @return string
     */
    public static function generateSafeFilename($originalName, $userId)
    {
        // 获取文件扩展名
        $extension = pathinfo($originalName, PATHINFO_EXTENSION);
        
        // 生成唯一文件名
        $filename = 'avatar_' . $userId . '_' . time() . '_' . uniqid();
        
        // 如果有扩展名，添加扩展名
        if ($extension) {
            $filename .= '.' . $extension;
        }
        
        return $filename;
    }
    
    /**
     * 验证文件类型
     * @param string $filePath 文件路径
     * @param array $allowedTypes 允许的文件类型
     * @return bool
     */
    public static function validateFileType($filePath, $allowedTypes = [
        'image/jpeg', 
        'image/jpg', 
        'image/png', 
        'image/gif', 
        'image/webp',
        'image/bmp',
        'image/wbmp',
        'image/x-ms-bmp',  // Windows BMP格式的另一种MIME类型
        'image/vnd.wap.wbmp'  // WBMP的另一种MIME类型
    ])
    {
        $mimeType = mime_content_type($filePath);
        
        // 如果MIME类型检测失败，尝试通过文件扩展名验证
        if (!$mimeType || $mimeType === 'application/octet-stream') {
            $extension = strtolower(pathinfo($filePath, PATHINFO_EXTENSION));
            $allowedExtensions = ['jpg', 'jpeg', 'png', 'gif', 'webp', 'bmp', 'wbmp'];
            return in_array($extension, $allowedExtensions);
        }
        
        return in_array($mimeType, $allowedTypes);
    }
    
    /**
     * 验证文件大小
     * @param string $filePath 文件路径
     * @param int $maxSize 最大文件大小（字节）
     * @return bool
     */
    public static function validateFileSize($filePath, $maxSize = 5 * 1024 * 1024) // 5MB
    {
        return filesize($filePath) <= $maxSize;
    }
}
